// MessageModel.h
// Created by Limou on 24-8-13.
// 本数据类描述了一个消息模型, 可以根据不同的消息类型得到不同的消息模型
// 构造方法只能构造一个属性为空的模型对象
// makexxx() 携带多个参数构造一个属性非空的模型对象, 部分属性可以自动生成, 但是其他属性需要强制设置
// setxxx() 设置模型对象内部属性
// getxxx() 获取模型对象内部属性
// 为了支持不同的消息类型, 本文件内部也定义了消息类型枚举体 enum MessageType{}

#ifndef FRONTEND_MESSAGEMODEL_HPP
#define FRONTEND_MESSAGEMODEL_HPP

#include <QString>
#include "../common/Common.hpp"
#include "UserModel.hpp"

// >>> class MessageModel begin: 消息模型 >>>
namespace chat_system::model {
    class MessageModel {
    private:
        QString messageId_; // 消息唯一标识
        QString messageChatSessionId_; // 所属会话唯一标识
        common::MessageType messageType_; // 消息类型
        int64_t messageTime_; // 格式化时间
        UserModel messageSenderUser_; // 发送者用户信息
        QByteArray messageContent_; // 消息内容 NOTE: 必须是二进制数组, 否则不兼容多种类型的消息类型

    public:
        // 构造方法
        MessageModel()
        : messageId_("")
        , messageChatSessionId_("")
        , messageType_(common::MessageType::UNKNOWN_TYPE)
        , messageTime_(0)
        , messageSenderUser_(UserModel())
        , messageContent_(QByteArray()) {}

        // 工厂方法
        static MessageModel makeMessage(
            const QString& messageChatSessionId,
            const common::MessageType& messageType,
            const UserModel& messageSenderUser,
            const QByteArray& messageContent,
            const int64_t& time = common::Tools::getInstance()->getTimestamp(),
            const QString& messageId = common::Tools::getInstance()->getUuid("M")
        ) {
            auto messageModel = MessageModel();

            messageModel.setMessageChatSessionId(messageChatSessionId);
            messageModel.setMessageType(messageType);
            messageModel.setMessageSenderUser(messageSenderUser);
            messageModel.setMessageContent(messageContent);
            messageModel.setMessageTime(time);
            messageModel.setMessageId(messageId);

            if (messageType == common::MessageType::UNKNOWN_TYPE) {
                common::Tools::getInstance()->getLogger()->error("makeMessage() 遇到了未知的消息类型, 请注意正确使用");
            }

            return messageModel;
        }

        // 设置和获取
        const QString& getMessageId() const { return messageId_; }
        void setMessageId(const QString& messageId) { messageId_ = messageId; }

        const QString& getMessageChatSessionId() const { return messageChatSessionId_; }
        void setMessageChatSessionId(const QString& messageChatSessionId) { messageChatSessionId_ = messageChatSessionId; }

        const common::MessageType& getMessageType() const { return messageType_; }
        void setMessageType(common::MessageType messageType) { messageType_ = messageType; }

        const int64_t& getMessageTime() const { return messageTime_; }
        void setMessageTime(const int64_t& messageTime) { messageTime_ = messageTime; }

        const UserModel& getMessageSenderUser() const { return messageSenderUser_; }
        void setMessageSenderUser(const UserModel& messageSenderUser) { messageSenderUser_ = messageSenderUser_; }

        const QByteArray& getMessageContent() const { return messageContent_; }
        void setMessageContent(const QByteArray& messageContent) { messageContent_ = messageContent; }
    };
} // namespace chat_system::model end
// <<< class MessageModel end <<<

#endif //FRONTEND_MESSAGEMODEL_HPP
